package chapter9.javaFile.NIO;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class TestSerializacion {

	public static void main(String[] args) {

		/**
		 * SERIALIZANDO
		 */
		// Creación del objeto
		Perro perro = new Perro();
		perro.nombre = "Jack";
		perro.sexo = "Masculino";
		System.out.println("Antes de serializar, ¿el perro muerde?: "
				+ Perro.muerde);
		Perro.muerde = "SI";

		// Genereamos un FileOutputStream que contendrá el fichero.
		FileOutputStream fos = null;
		try {
			fos = new FileOutputStream("ficheroSerializado.txt");
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		// Generamos un ObjectOutputStream para guardar el objeto Perro
		ObjectOutputStream oos = null;
		try {
			oos = new ObjectOutputStream(fos);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		// Escribimos el objeto perro
		try {
			oos.writeObject(perro);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		// Cerramos el ObjectOutputStream
		try {
			oos.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		/**
		 * DESERIALIZANDO...
		 */
		// Creamos un FileInputStream que contendrá el fichero serializado
		FileInputStream fis = null;
		try {
			fis = new FileInputStream("ficheroSerializado.txt");
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		// Creamos un ObjectInputStream
		ObjectInputStream ois = null;
		try {
			ois = new ObjectInputStream(fis);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		// Y recuperamos el objeto Perro deserializado
		Perro perroDeserializado = null;
		try {
			perroDeserializado = (Perro) ois.readObject();
			// Cierro el objeto ois.
			ois.close();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		if (perroDeserializado != null) {
			System.out
					.println("nombre del perro: " + perroDeserializado.nombre);
			System.out.println("Sexo del perro: " + perroDeserializado.sexo);
			System.out.println("Perro muerde?: " + Perro.muerde);
		}
	}
}

class Perro extends Animal {

	/**
	 * 
	 */
	private static final long serialVersionUID = 7118610557025924918L;
	String nombre;
	static String muerde = "NO";
}

class Animal implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = -1915382519706024095L;
	transient String sexo;

	public Animal() {
		System.out.println("Constructor por defecto de Animal");
	}
}
